package hyl.core;

import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Enumeration;
import hyl.core.db.DBPool;
import hyl.core.db.MyDB;

/**
 * 
 * 
 * my是hyl框架的核心配置程序用例 每个程序下面可以拷贝一份 核心管理单元 所有线程必须在此注册方便后续关闭
 * 
 * @author zdy
 *
 */
public abstract class Amy extends AIni {
	protected static final DBPool dbpool;
	// 规定:所有程序只能用UTF-8编码,防止乱码
	static {
	System.out.println("Amy");
		dbpool = DBPool.getInstance();
/*		
		  Runtime runtime = Runtime.getRuntime(); Thread thread = new Thread(new
		  Runnable() {
		  
		  @Override public void run() { if (onExit != null) onExit.run(); } });
		  runtime.addShutdownHook(thread);
		 */
		Log.info("内核加载完毕");
	}

	public static void closeDb() {
		// timerdb.closeAll();
		DBPool.exitAll();
		Log.info("所有数据库连接池关闭");
		destroyJDBCDrivers();
		Log.info("所有驱动已经卸载");
	}

	/////////////////////////////// 以下的代码是注册区,可以重写,和自定义 /////////////////////
	public static String DB1 = "db1";
	public static String RD1 = "redis1";
	// static MyDB timerdb;
	static MyDB commitdb;

	public static MyDB createDb() {
		// 通过连接创建DB对象 操作sql
		return MyDB.createDB(DB1);
	}

	public static MyDB getTimerDB1(int 提交周期_ms) {
		// 通过连接创建DB对象 操作sql
		return MyDB.createTimerDB(DB1, 提交周期_ms);
	}

	public static MyDB getDB1() {
		return MyDB.createDB(DB1);
	}

	public static MyDB createCommitDb() {
		// 通过连接创建DB对象 操作sql
		return MyDB.createCommitDB(DB1);
	}

	/*
	 * public static MyDB createTimerDb() { return MyDB.createTimerDB(DB1); }
	 */
	public static MyDB getCommitDB1() {
		// 通过连接创建DB对象 操作sql
		if (commitdb == null)
			commitdb = MyDB.createCommitDB(DB1);
		return commitdb;
	}

	// 会引发tomcat线程无法关闭
	// 通过连接创建DB对象操作sql
	/*
	 * public synchronized static MyDB getTimerDb1() { if (null == timerdb) timerdb
	 * = MyDB.createTimerDB(DB1); return timerdb; }
	 */
	// 关闭所有加载的驱动
	private static void destroyJDBCDrivers() {
		final Enumeration<Driver> drivers = DriverManager.getDrivers();
		Driver driver;
		while (drivers.hasMoreElements()) {
			driver = drivers.nextElement();
			try {
				DriverManager.deregisterDriver(driver);
				Log.info(String.format("卸载 JDBC driver %s 成功", driver));
			} catch (SQLException e) {
				Log.info(String.format("卸载 JDBC driver %s 异常", driver), e);
			}
		}
	}
}
